# -*- coding: utf-8 -*-
"""
Created on Tue Sep  3 13:33:02 2019

@author: zhangjuefei
"""
import numpy as np

def rnn_inference(x):
    """
    x: 20 行 30 列阵列，代表 30 步，每步 20 个值的 3 秒钟传感器序列。
    """
    
    # 读取 RNN 的权值矩阵
    W = np.mat(np.fromfile("W.bin").reshape(40, 20))  # W 是 40 x 20 的权值矩阵
    Y = np.mat(np.fromfile("Y.bin").reshape(40, 40))  # Y 是 40 * 40 的权值矩阵
    b = np.mat(np.fromfile("b.bin").reshape(40, 1))  # b 是 40 想1 的偏置向量
    
    W1 = np.mat(np.fromfile("W1.bin").reshape(16, 40))  # W1 是第一全连接层的 16 x 40 的权值矩阵
    b1 = np.mat(np.fromfile("b1.bin").reshape(16, 1))  # b1 是第一全连接层的 16 x 40 的权值矩阵
    
    W2 = np.mat(np.fromfile("W2.bin").reshape(2, 16))  # W1 是第二全连接层的 2 x 16 的权值矩阵
    b2 = np.mat(np.fromfile("b2.bin").reshape(2, 1))  # b1 是第二全连接层的 2 x 1 的权值矩阵
    
    # RNN 部分
    y = None
    for i in range(x.shape[1]):  # x 有 30 列
        tmp = W * x[:,i] + b  # 权值矩阵 W 乘以 x 的第 i 列，再乘偏置
        
        if y is not None:
            tmp += Y * y
        
        y = ReLU(tmp)
    
    # 全连接部分
    y = ReLU(W1 * y + b1)
    y = SoftMax(W2 * y + b2)
    
    return y


def ReLU(x):
    return np.mat(np.where(x > 0.0, x, 0.1 * x))


def SoftMax(x):
    x[x > 1e2] = 1e2  # 防止指数过大
    ep = np.power(np.e, x)
    return ep / np.sum(ep)



  
probs = []
for j in range(len(test_x)):
    # x = test_x[j, :].reshape(dimension, seq_len)
    x = np.mat(test_x[j, :]).reshape(dimension, seq_len)
    probs.append(rnn_inference(x).A1)

# 取概率最大的类别为预测类别
probs = np.array(probs)
pred = np.argmax(probs, axis=1)
truth = np.argmax(test_y, axis=1)
accuracy = accuracy_score(truth, pred)
auc = roc_auc_score(truth, probs[:, 1])
